package com.jketing.entity.model.base;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;

/**
 * Region 行政区域实体对象
 * 
 * @author  李荣华
 * @version v1.0
 * @date     2012-07-12
 * @since   JDK1.6
 */
@SuppressWarnings("serial")
@Entity
@Table(name = "t_Region",schema="dbo")
public class Area implements Serializable {
	/**
	 * id 主键id
	 */
	private Integer id;
	/**
	 * Region 上级行政区域
	 */
	private Area parent;
	/**
	 * grade 行政区域级别（在树形结构中的层次）
	 */
	private String grade;
	/**
	 * routeId 行政区域全路径ID值，如本级ID为4上级ID为2，2的上级为1，则此routeId值为：1/2/4
	 */
	private String routeId;
	/**
	 * routeName 行政区域全路径名称值，如本级名称为会泽县，会泽县上级为曲靖市，则此routeName值为：云南省/曲靖市/会泽县
	 */
	private String routeName;
	/**
	 * code 行政区域代码
	 */
	private String code;
	/**
	 * name 行政区域名称
	 */
	private String name;
	/**
	 * shortName 行政区域简称
	 */
	private String shortName;
	/**
	 * postCode 邮政编码
	 */
	private String postCode;
	/**
	 * areaCode 电话区号
	 */
	private String areaCode;
	/**
	 * children 本区域下直接所属下级区域列表
	 */
	private Set<Area> children = new HashSet<Area>();
	/**
	 * remark 备注
	 */
	private String remark; 
	
	/**
	 * id 组织机构PK
	 * @return
	 */
	@Id
	@GeneratedValue
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * parent 由ParentId引用的上级对象
	 */
	@ManyToOne
	@JoinColumn(name = "Parentid")
	public Area getParent() {
		return parent;
	}
	public void setParent(Area parent) {
		this.parent = parent;
	}

	/**
	 *  grade 级别（在树形结构中的层次）
	 */
	public String getGrade() {
		return grade;
	}
	public void setGrade(String grade) {
		this.grade = grade;
	}

	/**
	 * routeId 行政区域全路径ID值，如本级ID为4上级ID为2，2的上级为1，则此routeId值为：1/2/4
	 */
	@Column(name="routeid",length=4000)
	public String getRouteId() {
		return routeId;
	}
	public void setRouteId(String routeId) {
		this.routeId = routeId;
	}

	/**
	 * routeName 行政区域全路径名称值，如本级名称为会泽县，会泽县上级为曲靖市，则此routeName值为：云南省/曲靖市/会泽县
	 */
	@Column(name="routename",length=8000)
	public String getRouteName() {
		return routeName;
	}
	public void setRouteName(String routeName) {
		this.routeName = routeName;
	}
	
	/**
	 * code 行政区域代码
	 */
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	
	/**
	 * name 机构全称
	 */
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * shortName 行政区域简称
	 */
	@Column(name="shortname")
	public String getShortName() {
		return shortName;
	}
	public void setShortName(String shortName) {
		this.shortName = shortName;
	}
	
	/**
	 * postCode 邮政编码
	 */
	@Column(name="postcode")
	public String getPostCode() {
		return postCode;
	}
	public void setPostCode(String postCode) {
		this.postCode = postCode;
	}
	
	/**
	 * areaCode 电话区号
	 */
	@Column(name="areacode")
	public String getAreaCode() {
		return areaCode;
	}
	public void setAreaCode(String areaCode) {
		this.areaCode = areaCode;
	}
	
	/**
	 * children 本机构下直接所属下级机构列表
	 */
	@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@OrderBy(value = "id ASC")
	public Set<Area> getChildren() {
		return children;
	}
	public void setChildren(Set<Area> children) {
		this.children = children;
	}
	
	/**
	 * 增加下级组织机构
	 * @param organ
	 */
	public void addOrgan(Area obj) {
		if (!this.children.contains(obj)) {
			this.children.add(obj);
			obj.setParent(this);
		}
	}	

	/**
	 * 删除下级组织机构
	 * @param organ
	 */
	public void removeOrgan(Area obj) {
		if (this.children.contains(obj)) {
			obj.setParent(null);
			this.children.remove(obj);
		}
	}
	
	/**
	 * remark 备注
	 * @return
	 */
	public String getRemark() {
		return remark;
	}
	public void setRemark(String remark) {
		this.remark = remark;
	}
	
	/**
	 * 返回对象的散列代码值。该实现根据此对象 中 id 字段计算散列代码值。
	 * 
	 * @return 此对象的散列代码值。
	 */
	@Override
	public int hashCode() {
		int hash = 0;
		hash += (this.id != null ? this.id.hashCode() : 0);
		return hash;
	}

	/**
	 * 确定其他对象是否等于此 Organ。当且仅当 参数不为 null 且该参数是具有与此对象相同 id 字段值的 Organ 对象时， 结果才为
	 * <code>true</code>。
	 * 
	 * @param 对象
	 *            ，要比较的引用对象 如果此对象与参数相同，则 @return <code>true</code>； 否则为
	 *            <code>false</code>。
	 */
	@Override
	public boolean equals(Object object) {
		if (!(object instanceof Area)) {
			return false;
		}
		Area other = (Area) object;
		if (this.id != other.id
				&& (this.id == null || !this.id.equals(other.id)))
			return false;
		return true;
	}

	/**
	 * 返回对象的字符串表示法。该实现根据 id 字段 构造此表示法。
	 * 
	 * @return 对象的字符串表示法。
	 */
	@Override
	public String toString() {
		return this.getClass().getName() + "[id=" + id + "]";
	}
}
